package br.com.edoc.controller.cadastro;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import br.com.edoc.controller.listagem.ListagemCidadeController;
import br.com.edoc.controller.listagem.ListagemUFController;
import br.com.edoc.entidade.Cidade;
import br.com.edoc.entidade.Email;
import br.com.edoc.entidade.Endereco;
import br.com.edoc.entidade.Funcionario;
import br.com.edoc.entidade.Telefone;
import br.com.edoc.entidade.UF;
import br.com.edoc.excecoes.ExceptionApplication;
import br.com.edoc.excecoes.ExceptionValidador;
import br.com.edoc.gerentes.GerenteCadastro;
import br.com.edoc.ouvinte.OuvinteSelecao;
import br.com.edoc.validador.ValidadorEmail;
import br.com.edoc.validador.ValidadorEndereco;
import br.com.edoc.validador.ValidadorTelefone;
@ManagedBean(name="cadastroFuncionario")
@SessionScoped
public class CadastroFuncionarioController extends CadastroPadraoController{
	/**
	 * 
	 */
	private static final long serialVersionUID = 4443825128269897914L;
	
	private Funcionario funcionario;
	
	private Endereco endereco;

	private Telefone telefone;

	private Email email;
	
	@Override
	public void acaoInserir() {
		// TODO Auto-generated method stub
		GerenteCadastro gc = getAtendente().chamaGerenteCadastro();
		try {
			
			gc.incluir(getFuncionario());
			addInfoMessage("Funcionário cadastrado com sucesso");
		} catch (ExceptionApplication e) {
			// TODO Auto-generated catch block
			addErroMessage(e);
		} catch (ExceptionValidador e) {
			// TODO Auto-generated catch block
			addAlertMessage(e);
		}
	}

	@Override
	public void acaoAlterar() {
		// TODO Auto-generated method stub
		GerenteCadastro gc = getAtendente().chamaGerenteCadastro();
		try {
			gc.alterar(getFuncionario());
			addInfoMessage("Funcionário cadastrado com sucesso");
		} catch (ExceptionApplication e) {
			// TODO Auto-generated catch block
			addErroMessage(e);
		} catch (ExceptionValidador e) {
			// TODO Auto-generated catch block
			addAlertMessage(e);
		}
	}

	@Override
	public void acaoRemover() {
		// TODO Auto-generated method stub
		GerenteCadastro gc = getAtendente().chamaGerenteCadastro();
		try {
			gc.deletar(getFuncionario());
			addInfoMessage("Funcionário cadastrado com sucesso");
		} catch (ExceptionApplication e) {
			// TODO Auto-generated catch block
			addErroMessage(e);
		}
	}

	public Funcionario getFuncionario() {
		return funcionario;
	}

	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}

	public Endereco getEndereco() {
		if(endereco == null){
			endereco = new Endereco();
		}
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	public Telefone getTelefone() {
		if(telefone == null){
			telefone = new Telefone();
		}
		return telefone;
	}

	public void setTelefone(Telefone telefone) {
		this.telefone = telefone;
	}

	
	public Email getEmail() {
		if(email == null){
			email = new Email();
		}
		return email;
	}

	public void setEmail(Email email) {
		this.email = email;
	}
	
	
	public void acaoAddEmail(){
		try {
			(new ValidadorEmail()).valida(getEmail());
			if(!getFuncionario().getListaEmails().contains(getEmail())){
				getEmail().setPessoa(getFuncionario());
				getFuncionario().getListaEmails().add(getEmail());
				setEmail(null);
			}else{
				getFuncionario().getListaEmails().set(getFuncionario().getListaEmails().indexOf(getEmail()),getEmail());
				setEmail(null);
			}
		} catch (ExceptionValidador e) {
			// TODO Auto-generated catch block
			addAlertMessage(e.getMessage());
		}

	}
	public void acaoAddEnderecoServidor(){

		try {
			(new ValidadorEndereco()).valida(getEndereco());
			if(!getFuncionario().getListaEndereco().contains(getEndereco())){
				getEndereco().setPessoa(getFuncionario());
				getFuncionario().getListaEndereco().add(getEndereco());
				setEndereco(null);
			}else{

				getFuncionario().getListaEndereco().set(getFuncionario().getListaEndereco().indexOf(getEndereco()), getEndereco());
				setEndereco(null);
			}
		} catch (ExceptionValidador e) {
			// TODO Auto-generated catch block
			addAlertMessage(e.getMessage());
		}


	}
	public void acaoRemoverEndereco(){
		getFuncionario().getListaEndereco().remove(getEndereco());
		setEndereco(null);
	}
	public void mostrarListagemCidade(){
		ListagemCidadeController listagem = new ListagemCidadeController();
		Cidade query = new Cidade();
		query.setDescricao(getEndereco().getCidade().getDescricao());
		
		listagem.setQuery(query);

		listagem.setOuvinteSelecao(new OuvinteSelecao() {

			@Override
			public void selecaoFeita(Object object) {
				// TODO Auto-generated method stub
				getEndereco().setCidade((Cidade) object);
			}
		});
		showInFormPopUp("listagemCidade");
	}
	public void mostrarListagemUF(){
		ListagemUFController listagem =new ListagemUFController();
		UF query = new UF();
		query.setDescricao(getEndereco().getCidade().getUf().getDescricao());
		listagem.setQuery(query);
		listagem.setOuvinteSelecao(new OuvinteSelecao() {

			@Override
			public void selecaoFeita(Object object) {
				// TODO Auto-generated method stub
				getEndereco().setCidade(null);
				getEndereco().getCidade().setUf((UF) object);
			}
		});
		showInFormPopUp("listagemUF");
	}

	public void acaoRemoverTelefone(){
		getFuncionario().getListaTelefones().remove(getTelefone());
		setTelefone(null);
	}

	public void acaoAddTelefone(){
		try {
			(new ValidadorTelefone()).valida(getTelefone());
			if(!getFuncionario().getListaTelefones().contains(getTelefone())){
				getTelefone().setPessoa(getFuncionario());
				getFuncionario().getListaTelefones().add(getTelefone());
				setTelefone(null);
			}else{
				getFuncionario().getListaTelefones().set(getFuncionario().getListaTelefones().indexOf(getTelefone()), getTelefone());
				setTelefone(null);
			}
		} catch (ExceptionValidador e) {
			// TODO Auto-generated catch block
			addAlertMessage(e.getMessage());
		}

	}


}
